package com.zzh.service.impl;

import cn.hutool.http.HttpException;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zzh.entity.Result;
import com.zzh.service.BianceAnnouncement;
import com.zzh.utils.ResultUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.apache.commons.codec.binary.Base64;
import lombok.extern.slf4j.Slf4j;

import javax.annotation.Resource;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.*;
import java.net.URLEncoder;

/**
 * @author wenrouyue
 * @FileName: BianceAnnouncementImpl
 * @description
 * @create 2023/4/27-16:36
 **/

@Slf4j
@Service("BianceAnnouncement")
public class BianceAnnouncementImpl implements BianceAnnouncement {
    @Value("${wenrouyue.BianceAnnouncement}")
    private String bianceAnnouncementUrl;
    @Value("${wenrouyue.RedisCode}")
    private String code;

    @Resource
    private RedisTemplate<String, String> redisTemplate;
    ThreadPoolExecutor executor;
    private boolean isStop = false;
    /**
     * 400等待
     */
    private static final int WAIT_TIME = 3000;

    /**
     * 定时执行
     */
   // private static final int BIANCE_FREQUENCY = 1300000000;
    private static final int BIANCE_FREQUENCY = 13000;

    public void stop() {
        this.isStop = true;
    }

    public boolean isStopped() {
        return this.isStop;
    }

    @Scheduled(fixedRate = BIANCE_FREQUENCY)
    public void runTask() {
        if (isStopped()) {
            try {
                log.info("isStopped is go");
                Thread.sleep(WAIT_TIME);
                this.isStop = false;
            } catch (InterruptedException e) {
                log.info("runTask():{}", e.getLocalizedMessage());
            }
        } else {
            log.info("searchAnnouncement is go");
            this.searchAnnouncement();
        }
    }


    @Override
    public Result<String> searchAnnouncement() {
        try {
            HttpRequest request = HttpUtil.createGet(bianceAnnouncementUrl)
                    .setConnectionTimeout(10000)
                    .setReadTimeout(10000)
                    .addHeaders(createHeader());
            HttpResponse getResponse = request.execute();
            String body = getResponse.body();
            String errorMsg = "{\"msg\":\"Access denied\",\"code\":400}";
            if (errorMsg.equals(body)) {
                log.info("频率过高,先暂停");
                stop();
                return ResultUtil.getError(500, "调用频率太高");
            }
            JSONObject js = JSON.parseObject(body);
            // 最外层列表
            JSONArray catalogs = js.getJSONObject("data").getJSONArray("catalogs");
            // 获取8个模块的第一个公告的code
            List<String> list = codeList(catalogs);
            int maxListSize = 8;
            if (list.size() != maxListSize) {
                return ResultUtil.getError(500, "调用频率太高");
            }
            // 获取不存在,需要发送钉钉的code坐标
            List<Integer> notInIndex = getNotInRedisSet(list, code);
            ThreadFactory threadFactory = new CustomThreadFactory("DataPool", code, catalogs, notInIndex);
            executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(10, threadFactory);
            int pool = notInIndex.size();
            if (pool > 0) {
                CompletableFuture<String> future = new CompletableFuture<>();
                for (int i = 1; i <= pool; i++) {
                    executor.submit(() -> {
                        String result = Thread.currentThread().getName();
                        future.complete(result);
                    });
                }
                future.thenApply(name -> {
                    Long add = redisTemplate.opsForSet().add(code, name);
                    if (add != null && add == 1) {
                        log.info("插入redis公告成功:{}", name);
                    }
                    return name;
                });
                executor.shutdown();
                return ResultUtil.getSuccess("获取成功" + pool + "条");
            }
            String time = toStrTime(Long.toString(System.currentTimeMillis()));
            log.info("{} 无新公告", time);
            executor.shutdown();
            return ResultUtil.getSuccess("无新公告");
        } catch (HttpException e) {
            e.printStackTrace();
            log.info("searchAnnouncement:{}", e.getLocalizedMessage());
            executor.shutdown();
        }
        return ResultUtil.getSuccess("无新公告");
    }

    private static class CustomThreadFactory implements ThreadFactory {
        private final String poolName;
        private int count;
        private final JSONArray catalogs;
        private final List<Integer> notInIndex;
        private final String redisKey;

        public CustomThreadFactory(String poolName, String redisKey, JSONArray catalogs, List<Integer> notInIndex) {
            this.poolName = poolName;
            this.count = 0;
            this.catalogs = catalogs;
            this.notInIndex = notInIndex;
            this.redisKey = redisKey;
        }


        @Override
        public Thread newThread(Runnable r) {
            Thread t = new Thread(r, poolName + "-Thread-" + count++);
            JSONObject announcement = (JSONObject) catalogs.get(notInIndex.get(count - 1));
            String catalogName = announcement.getString("catalogName");
            JSONArray articles = announcement.getJSONArray("articles");
            // 每一个详情
            JSONObject details = (JSONObject) articles.get(0);
            String code = details.getString(redisKey);
            String releaseDate = toStrTime(details.getString("releaseDate"));
            String title = details.getString("title");
            String connect;
            if ("".equals(catalogName)) {
                connect = releaseDate + " 来自币安的公告:\n重要重要重要!有币下架了,赶紧去看看有没有合约开!\n内容如下:\n" + title;
            } else {
                connect = releaseDate + " 来自币安的公告=内容如下:\n" + title;
            }
            log.info("获取到新公告=>{}", connect);
            t.setName(code);
            callBot(connect);
            return t;
        }
    }

    /**
     * // 获取api 0-8项 第一个code
     * // 公告所属目录
     * // 0 数字货币及交易对上新
     * // 1 币安最新动态
     * // 2 币安最新活动
     * // 3 法币及交易对上新
     * // 4 下架讯息
     * // 5 钱包维护动态
     * // 6 币安API更新
     * // 7 空投
     *
     * @param catalogs 0-8
     * @return codeList
     */
    public List<String> codeList(JSONArray catalogs) {
        ArrayList<String> list = new ArrayList<>();
        int num = 8;
        for (int i = 0; i < num; i++) {
            JSONObject dataList = (JSONObject) catalogs.get(i);
            JSONObject article = (JSONObject) dataList.getJSONArray("articles").get(0);
            list.add(article.getString(code));
        }
        return list;
    }

    /**
     * 获取redis中set集合中是否存在
     *
     * @param list     目标列表
     * @param redisKey redisKey
     * @return 不存在元素的坐标
     */
    public List<Integer> getNotInRedisSet(List<String> list, String redisKey) {
        Set<String> redisSet = redisTemplate.opsForSet().members(redisKey);
        List<Integer> nonExistingElements = new ArrayList<>();
        if (redisSet != null) {
            for (int i = 0; i < list.size(); i++) {
                if (!redisSet.contains(list.get(i))) {
                    nonExistingElements.add(i);
                }
            }
        }
        return nonExistingElements;
    }

    public Map<String, String> createHeader() {
        HashMap<String, String> map = new HashMap<>(30);
        map.put("authority", "www.yingwangtech.net");
        map.put("scheme", "https");
        map.put("path", "/bapi/composite/v1/public/cms/article/list/query?type=1&pageNo=1&pageSize=3");
        map.put("accept", "application/json, text/plain, */*");
        map.put("accept-encoding", "gzip, deflate, br");
        map.put("accept-language", "zh-CN");
        map.put("cookie", "logined=y");
        map.put("sec-fetch-dest", "empty");
        map.put("sec-fetch-mode", "cors");
        map.put("sec-fetch-site", "cross-site");
        map.put("user-agent", "" + randomUserAgent());
        map.put("bnc-currency", "CNY");
        map.put("bnc-location", "BINANCE");
        map.put("bnc-time-zone", "Asia/Shanghai");
        map.put("bnc-uuid", UUID.randomUUID().toString());
        map.put("clienttype", "electron");
        map.put("device-info", "" + randomInfo());
        map.put("fvideo-id", "" + randomFvideo());
        map.put("lang", "zh-CN");
        map.put("mclient-x-tag", "tfph2mpTPAuwxbiMHoQc");
        map.put("sec-ch-ua", "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"102\"");
        map.put("sec-ch-ua-mobile", "?0");
        map.put("sec-ch-ua-platform", "\"Windows\"");
        map.put("versionname", "1.45.2");
        map.put("x-token", "electron.152283271." + randomToken());
        return map;
    }

    public String randomUserAgent() {
        List<String> list = Arrays.asList("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36",
                "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Edge/90.0.818.49 Safari/537.36 Edg/90.0.818.49",
                "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Firefox/88.0.1",
                "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36",
                "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36",
                "Mozilla/5.0 (iPad; CPU OS 14_4_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Mobile/15E148 Safari/604.1",
                "Mozilla/5.0 (iPhone; CPU iPhone OS 14_4_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Mobile/15E148 Safari/604.1",
                "Mozilla/5.0 (Linux; Android 11; SM-G975F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.66 Mobile Safari/537.36",
                "Mozilla/5.0 (Windows NT 10.0; Win64; x64; Xbox; Xbox One) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36 Edge/18.19041",
                "Mozilla/5.0 (Nintendo Switch; Firmware/13.0.0; JP) AppleWebKit/537.36 (KHTML, like Gecko) Nx/9.3.0.14.13 NintendoBrowser/5.1.0.19169 ",
                "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.5 Safari/537.36",
                "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/536.36 (KHTML, like Gecko) Edge/90.0.108.49 Safari/537.36 Edg/90.0.818.49",
                "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/535.36 (KHTML, like Gecko) Firefox/88.0.3",
                "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_3) AppleWebKit/534.36 (KHTML, like Gecko) Chrome/89.0.4119.82 Safari/537.36",
                "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/532.36 (KHTML, like Gecko) Chrome/90.0.4120.72 Safari/537.36",
                "Mozilla/5.0 (iPad; CPU OS 14_4_2 like Mac OS X) AppleWebKit/601.1.15 (KHTML, like Gecko) Version/14.3.3 Mobile/15E148 Safari/604.1",
                "Mozilla/5.0 (iPhone; CPU iPhone OS 14_4_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Mobile/15E148 Safari/604.1",
                "Mozilla/5.0 (Linux; Android 11; SM-G975F) AppleWebKit/532.36 (KHTML, like Gecko) Chrome/90.0.4131.66 Mobile Safari/537.36",
                "Mozilla/5.0 (Windows NT 10.0; Win64; x64; Xbox; Xbox One) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4562.77 Safari/537.36 Edge/18.19041",
                "Mozilla/5.0 (Nintendo Switch; Firmware/13.0.0; JP) AppleWebKit/532.36 (KHTML, like Gecko) Nx/9.3.0.13.10 NintendoBrowser/5.1.0.19189 ");
        return list.get(new Random().nextInt(20));
    }

    public String randomInfo() {
        List<String> list = Arrays.asList("eyJzY3JlZW5HV0aW9uIjoiODE2LDE1MzYiLCJzeXkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWF4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDoxN0ZW1fdmVyc2lvbiI6IldpbmRvd3MgMTAiLCJicmFuZF9tb2RlbCI6InVfcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiYXZhaWxhYmxlX3NjcmVlbl9yZXNvbua25vd24iLCJzeXN0ZW1fbGFuZyI6InpoLUNOIiwidGltZXpvbmUiOiJHTVQrOCIsInRpbWV6b25lT2Zmc2V0IjotNDgwLCJ1c2VyX2FnZW50IjoiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQmluYW5jZS8xLjQ1LjEgQ2hyb21lLzEwMi4wLjUwMDUuMTY3IEVsZWN0cm9uLzE5LjEuOSBTYWZhcmkvNTM3LjM2IiwibGlzdF9wbHVnaW4iOiJQREYgVmlld2VyLENocm9tZSBQREYgVmlld2VyLENocm9taXVtIFBERiBWaWV3ZXIsTWljcm9zb2Z0IEVkZ2UgUERGIFZpZXdlcixXZWJLaXQgYnVpbHQtaW4gUERGIiwiY2FudmFzX2NvZGUiOiIxMjA4OWQwMyIsIndlYmdsX3ZlbmRvciI6Ikdvb2dsZSBJbmMuIChJbnRlbCkiLCJ3ZWJnbF9yZW5kZXJlciI6IkFOR0xFIChJbnRlbCwgSW50ZWwoUikgSXJpcyhSKSBYZSBHcmFwaGljcyBEaXJlY3QzRDExIHZzXzVfMCBwc181XzAsIEQzRDExKSIsImF1ZGlvIjoiMTI0LjA0MzQ3NTI3NTE2MDc0IiwicGxhdGZvcm0iOiJXaW4zMiIsIndlYl90aW1lem9uZSI6IkFzaWEvU2hhbmdoYWkiLCJkZXZpY2VfbmFtZSI6IkNocm9tZSBWMTAyLjAuNTAwNS4xNjcgKFdpbmRvd3MpIiwiZmluZ2VycHJpbnQiOiI1OWQwMDA2YmZhZjYzYzk4ZmMzMzFlYWUxY2UyYzM0YSIsImRldmljZV9pZCI6IiIsInJlbGF0ZWRfZGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFMTkyLjE2OC41Ni4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDoxMSIsImFwcF9pbnN0YWxsX2RhdGUiOjE2ODE3OTkyNDV9",
                "eyJzY3JlZW5fcmVzb2x1dGlvbiI6Ijg2NCwxNkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWF4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDoxTM2IiwiYXZhaWxhYmxlX3NjcmVlbl9yZXNvbH2RlbCI6InVfcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiV0aW9uIjoiODE2LDE1MzYiLCJzeXN0ZW1fdmVyc2lvbiI6IldpbmRvd3MgMTAiLCJicmFuZF9tb2RlbCI6InVua25vd24iLCJzeXN0ZW1fbGFuZyI6InpoLUNOIiwidGltZXpvbmUiOiJHTVQrOCIsInRpbWV6b25lT2Zmc2V0IjotNDgwLCJ1c2VyX2FnZW50IjoiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQmluYW5jZS8xLjQ1LjEgQ2hyb21lLzEwMi4wLjUwMDUuMTY3IEVsZWN0cm9uLzE5LjEuOSBTYWZhcmkvNTM3LjM2IiwibGlzdF9wbHVnaW4iOiJQREYgVmlld2VyLENocm9tZSBQREYgVmlld2VyLENocm9taXVtIFBERiBWaWV3ZXIsTWljcm9zb2Z0IEVkZ2UgUERGIFZpZXdlcixXZWJLaXQgYnVpbHQtaW4gUERGIiwiY2FudmFzX2NvZGUiOiIxMjA4OWQwMyIsIndlYmdsX3ZlbmRvciI6Ikdvb2dsZSBJbmMuIChJbnRlbCkiLCJ3ZWJnbF9yZW5kZXJlciI6IkFOR0xFIChJbnRlbCwgSW50ZWwoUikgSXJpcyhSKSBYZSBHcmFwaGljcyBEaXJlY3QzRDExIHZzXzVfMCBwc181XzAsIEQzRDExKSIsImF1ZGlvIjoiMTI0LjA0MzQ3NTI3NTE2MDc0IiwicGxhdGZvcm0iOiJXaW4zMiIsIndlYl90aW1lem9uZSI6IkFzaWEvU2hhbmdoYWkiLCJkZXZpY2VfbmFtZSI6IkNocm9tZSBWMTAyLjAuNTAwNS4xNjcgKFdpbmRvd3MpIiwiZmluZ2VycHJpbnQiOiI1OWQwMDA2YmZhZjYzYzk4ZmMzMzFlYWUxY2UyYzM0YSIsImRldmGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFljZV9pZCI6IiIsInJlbGF0ZWRfZGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDox",
                "eyJzY3JlZW5fcmVzb2x1dGlvbiI6kcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWF4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDoxIjg2NCwxNTM2IiwiYXZhaWxhYmxlX3NjcmVlbl9yZXNvbHV0aW9uIjoiODE2LDE1MzYiLCJzeXN0ZW1fdmVyc2lvbiI6IldpbmR2RlbCI6InVfcmVzb2x1dGlvbiI6Ijg2NCwxNTM2Iiwivd3MgMTAiLCJicmFuZF9tb2RlbCI6InVua25vd24iLCJzeXN0ZW1fbGFuZyI6InpoLUNOIiwidGltZXpvbmUiOiJHTVQrOCIsInRpbWV6b25lT2Zmc2V0IjotNDgwLCJ1c2VyX2FnZW50IjoiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQmluYW5jZS8xLjQ1LjEgQ2hyb21lLzEwMi4wLjUwMDUuMTY3IEVsZWN0cm9uLzE5LjEuOSBTYWZhcmkvNTM3LjM2IiwibGlzdF9wbHVnaW4iOiJQREYgVmlld2VyLENocm9tZSBQREYgVmlld2VyLENocm9taXVtIFBERiBWaWV3ZXIsTWljcm9zb2Z0IEVkZ2UgUERGIFZpZXdlcixXZWJLaXQgYnVpbHQtaW4gUERGIiwiY2FudmFzX2NvZGUiOiIxMjA4OWQwMyIsIndlYmdsX3ZlbmRvciI6Ikdvb2dsZSBJbmMuIChJbnRlbCkiLCJ3ZWJnbF9yZW5kZXJlciI6IkFOR0xFIChJbnRlbCwgSW50ZWwoUikgSXJpcyhSKSBYZSBHcmFwaGljcyBEaXJlY3QzRDExIHZzXzVfMCBwc181XzAsIEQzRDExKSIsImF1ZGlvIjoiMTI0LjA0MzQ3NTI3NTE2MDc0IiwicGxhdGZvcm0iOiJXaW4zMiIsIndlYl90aW1lem9uZSI6IkFzaWEvU2hhbmdoYWkiLCJkZXZpY2VfbmFtZSI6IkNocm9tZSBWMTAyLjAuNTAwNS4xNjcgKFdpbmRvd3MpIiwiZmluZ2VycHJpbnQiOiI1OWQwMDA2YmZhZjYzYzk4ZmMzMzFlYWUxY2UyYzGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFM0YSIsImRldmljZV9pZCI6IiIsInJlbGF0ZWRfZGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDox",
                "eyJzY3JlZW5fcmVzb2x1dGlvbiI6Ijg2NCwxkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWF4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDoxNTM2IiwiYXZhaWxhYmxlX3NjcmVlbl9yZXNvbHV0aW9uIjoiODE2LDE2RlbCI6InVfcmVzb2x1dGlvbiI6Ijg2NCwxNTM2Iiwi1MzYiLCJzeXN0ZW1fdmVyc2lvbiI6IldpbmRvd3MgMTAiLCJicmFuZF9tb2RlbCI6InVua25vd24iLCJzeXN0ZW1fbGFuZyI6InpoLUNOIiwidGltZXpvbmUiOiJHTVQrOCIsInRpbWV6b25lT2Zmc2V0IjotNDgwLCJ1c2VyX2FnZW50IjoiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQmluYW5jZS8xLjQ1LjEgQ2hyb21lLzEwMi4wLjUwMDUuMTY3IEVsZWN0cm9uLzE5LjEuOSBTYWZhcmkvNTM3LjM2IiwibGlzdF9wbHVnaW4iOiJQREYgVmlld2VyLENocm9tZSBQREYgVmlld2VyLENocm9taXVtIFBERiBWaWV3ZXIsTWljcm9zb2Z0IEVkZ2UgUERGIFZpZXdlcixXZWJLaXQgYnVpbHQtaW4gUERGIiwiY2FudmFzX2NvZGUiOiIxMjA4OWQwMyIsIndlYmdsX3ZlbmRvciI6Ikdvb2dsZSBJbmMuIChJbnRlbCkiLCJ3ZWJnbF9yZW5kZXJlciI6IkFOR0xFIChJbnRlbCwgSW50ZWwoUikgSXJpcyhSKSBYZSBHcmFwaGljcyBEaXJlY3QzRDExIHZzXzVfMCBwc181XzAsIEQzRDExKSIsImF1ZGlvIjoiMTI0LjA0MzQ3NTI3NTE2MDc0IiwicGxhdGZvcm0iOiJXaW4zMiIsIndlYl90aW1lem9uZSI6IkFzaWEvU2hhbmdoYWkiLCJkZXZpY2VfbmFtZSI6IkNocm9tZSBWMTAyLjAuNTAwNS4xNjcgKFdpbmRvd3MpIiwiZmluZ2VycHJpbnQiOiI1OWQwMDA2YmZhZjYzYzk4ZmMzMzFlYWUxY2UyYzMGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWF0YSIsImRldmljZV9pZCI6IiIsInJlbGF0ZWRfZGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDox",
                "eyJzY3JlZW5fcmVzb2x1dGlvbikcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWF4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDoxI6Ijg2NCwxNTM2IiwiYXZhaWxhYmxlX3NjcmVlbl9yZXNvbHV0aW9uIjoiODE2LDE1MzYiLCJzeXN0ZW1fdmVyc2lvbiI6IldpbmRvd3MgMTAiLCJicmFuZF9tb2RlbCI62RlbCI6InVfcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiInVua25vd24iLCJzeXN0ZW1fbGFuZyI6InpoLUNOIiwidGltZXpvbmUiOiJHTVQrOCIsInRpbWV6b25lT2Zmc2V0IjotNDgwLCJ1c2VyX2FnZW50IjoiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQmluYW5jZS8xLjQ1LjEgQ2hyb21lLzEwMi4wLjUwMDUuMTY3IEVsZWN0cm9uLzE5LjEuOSBTYWZhcmkvNTM3LjM2IiwibGlzdF9wbHVnaW4iOiJQREYgVmlld2VyLENocm9tZSBQREYgVmlld2VyLENocm9taXVtIFBERiBWaWV3ZXIsTWljcm9zb2Z0IEVkZ2UgUERGIFZpZXdlcixXZWJLaXQgYnVpbHQtaW4gUERGIiwiY2FudmFzX2NvZGUiOiIxMjA4OWQwMyIsIndlYmdsX3ZlbmRvciI6Ikdvb2dsZSBJbmMuIChJbnRlbCkiLCJ3ZWJnbF9yZW5kZXJlciI6IkFOR0xFIChJbnRlbCwgSW50ZWwoUikgSXJpcyhSKSBYZSBHcmFwaGljcyBEaXJlY3QzRDExIHZzXzVfMCBwc181XzAsIEQzRDExKSIsImF1ZGlvIjoiMTI0LjA0MzQ3NTI3NTE2MDc0IiwicGxhdGZvcm0iOiJXaW4zMiIsIndlYl90aW1lem9uZSI6IkFzaWEvU2hhbmdoYWkiLCJkZXZpY2VfbmFtZSI6IkNocm9tZSBWMTAyLjAuNTAwNS4xNjcgKFdpbmRvd3MpIiwiZmluZ2VycHJpbnQiOiI1OWQwMDA2YmZhZjYzYzk4ZmMzMzFlYWUxY2UyYzM0GV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFYSIsImRlGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFdmljZV9pZCI6IiIsInJlbGF0ZWRfZGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMT",
                "eyJzY3JlZW5fcmVzb2x1dGlvbiI6Ijg2NCwxNTkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWF4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDoxM2IiwiYXZhaWxhYmxlX3NjcmVlbl9yZXNvbHV0aW9uIjoiODE2LDE1MzYiLCJzeXN0ZW1fdmVyc2lvbiI6IldpbmRvd3MgM2RlbCI6InVfcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiTAiLCJicmFuZF9tb2RlbCI6InVua25vd24iLCJzeXN0ZW1fbGFuZyI6InpoLUNOIiwidGltZXpvbmUiOiJHTVQrOCIsInRpbWV6b25lT2Zmc2V0IjotNDgwLCJ1c2VyX2FnZW50IjoiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQmluYW5jZS8xLjQ1LjEgQ2hyb21lLzEwMi4wLjUwMDUuMTY3IEVsZWN0cm9uLzE5LjEuOSBTYWZhcmkvNTM3LjM2IiwibGlzdF9wbHVnaW4iOiJQREYgVmlld2VyLENocm9tZSBQREYgVmlld2VyLENocm9taXVtIFBERiBWaWV3ZXIsTWljcm9zb2Z0IEVkZ2UgUERGIFZpZXdlcixXZWJLaXQgYnVpbHQtaW4gUERGIiwiY2FudmFzX2NvZGUiOiIxMjA4OWQwMyIsIndlYmdsX3ZlbmRvciI6Ikdvb2dsZSBJbmMuIChJbnRlbCkiLCJ3ZWJnbF9yZW5kZXJlciI6IkFOR0xFIChJbnRlbCwgSW50ZWwoUikgSXJpcyhSKSBYZSBHcmFwaGljcyBEaXJlY3QzRDExIHZzXzVfMCBwc181XzAsIEQzRDExKSIsImF1ZGlvIjoiMTI0LjA0MzQ3NTI3NTE2MDc0IiwicGxhdGZvcm0iOiJXaW4zMiIsIndlYl90aW1lem9uZSI6IkFzaWEvU2hhbmdoYWkiLCJkZXZpY2VfbmFtZSI6IkNocm9tZSBWMTAyLjAuNTAwNS4xNjcgKFdpbmRvd3MpIiwiZmluZ2VycHJpbnQiOiI1OWQwMDA2YmZhZjYzYzk4ZmMzMzFlYWUxY2UyYzM0YSIsGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFImRldmljZV9pZCI6IiIsInJlbGF0ZWRfZGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDox",
                "eyJzY3JlZW5fcmVzb2x1dGlvbiI6Ijg2NCwxNkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWF4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDoxTM2IiwiYXZhaWxhYmxlX3NjcmVlbl9yZXNvbHV0aW9uIjoiODE2LDE1MzYiLCJzeXN0ZW1fdmVyc2lvbiI62RlbCI6InVfcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiIldpbmRvd3MgMTAiLCJicmFuZF9tb2RlbCI6InVua25vd24iLCJzeXN0ZW1fbGFuZyI6InpoLUNOIiwidGltZXpvbmUiOiJHTVQrOCIsInRpbWV6b25lT2Zmc2V0IjotNDgwLCJ1c2VyX2FnZW50IjoiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQmluYW5jZS8xLjQ1LjEgQ2hyb21lLzEwMi4wLjUwMDUuMTY3IEVsZWN0cm9uLzE5LjEuOSBTYWZhcmkvNTM3LjM2IiwibGlzdF9wbHVnaW4iOiJQREYgVmlld2VyLENocm9tZSBQREYgVmlld2VyLENocm9taXVtIFBERiBWaWV3ZXIsTWljcm9zb2Z0IEVkZ2UgUERGIFZpZXdlcixXZWJLaXQgYnVpbHQtaW4gUERGIiwiY2FudmFzX2NvZGUiOiIxMjA4OWQwMyIsIndlYmdsX3ZlbmRvciI6Ikdvb2dsZSBJbmMuIChJbnRlbCkiLCJ3ZWJnbF9yZW5kZXJlciI6IkFOR0xFIChJbnRlbCwgSW50ZWwoUikgSXJpcyhSKSBYZSBHcmFwaGljcyBEaXJlY3QzRDExIHZzXzVfMCBwc181XzAsIEQzRDExKSIsImF1ZGlvIjoiMTI0LjA0MzQ3NTI3NTE2MDc0IiwicGxhdGZvcm0iOiJXaW4zMiIsIndlYl90aW1lem9uZSI6IkFzaWEvU2hhbmdoYWkiLCJkZXZpY2VfbmFtZSI6IkNocm9tZSBWMTAyLjAuNTAwNS4xNjcgKFdpbmRvd3MpIiwiZmluZ2VycHJpbnQiOiI1OWQwMDA2YmZhZjYzYzk4ZmMGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFzMzFlYWUxY2UyYzM0YSIsImRldmljZV9pZCI6IiIsInJlbGF0ZWRfZGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDox",
                "eyJzY3JlZW5fcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiYXZhaWxhYmxlX3NjcmVlbl9yZXNvbHV0aW9uIjokcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWF4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDoxiODE2LDE1MzYiLCJzeXN0ZW1fdmVyc2lvbiI6IldpbmRvd3MgMTAiLCJicmFuZF9tb2RlbCI6InVua25vd24iLCJze2RlbCI6InVfcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiXN0ZW1fbGFuZyI6InpoLUNOIiwidGltZXpvbmUiOiJHTVQrOCIsInRpbWV6b25lT2Zmc2V0IjotNDgwLCJ1c2VyX2FnZW50IjoiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQmluYW5jZS8xLjQ1LjEgQ2hyb21lLzEwMi4wLjUwMDUuMTY3IEVsZWN0cm9uLzE5LjEuOSBTYWZhcmkvNTM3LjM2IiwibGlzdF9wbHVnaW4iOiJQREYgVmlld2VyLENocm9tZSBQREYgVmlld2VyLENocm9taXVtIFBERiBWaWV3ZXIsTWljcm9zb2Z0IEVkZ2UgUERGIFZpZXdlcixXZWJLaXQgYnVpbHQtaW4gUERGIiwiY2FudmFzX2NvZGUiOiIxMjA4OWQwMyIsIndlYmdsX3ZlbmRvciI6Ikdvb2dsZSBJbmMuIChJbnRlbCkiLCJ3ZWJnbF9yZW5kZXJlciI6IkFOR0xFIChJbnRlbCwgSW50ZWwoUikgSXJpcyhSKSBYZSBHcmFwaGljcyBEaXJlY3QzRDExIHZzXzVfMCBwc181XzAsIEQzRDExKSIsImF1ZGlvIjoiMTI0LjA0MzQ3NTI3NTE2MDc0IiwicGxhdGZvcm0iOiJXaW4zMiIsIndlYl90aW1lem9uZSI6IkFzaWEvU2hhbmdoYWkiLCJkZXZpY2VfbmFtZSI6IkNocm9tZSBWMTAyLjAuNTAwNS4xNjcgKFdpbmRvd3MpIiwiZmluZ2VycHJpbnQiOiI1OWQwMDA2YmZhZjYzYzk4ZmGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFMzMzFlYWUxY2UyYzM0YSIsImRldmljZV9pZCI6IiIsInJlbGF0ZWRfZGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDox",
                "eyJzY3JlZW5fcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiYXZhaWxhYmxlX3NjcmVlbl9yZXNvbHV0aW9uIjoiODE2LkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWF4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDoxDE1MzYiLCJzeXN0ZW1fdmVyc2lvbiI6IldpbmRvd3MgMTAi2RlbCI6InVfcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiLCJicmFuZF9tb2RlbCI6InVua25vd24iLCJzeXN0ZW1fbGFuZyI6InpoLUNOIiwidGltZXpvbmUiOiJHTVQrOCIsInRpbWV6b25lT2Zmc2V0IjotNDgwLCJ1c2VyX2FnZW50IjoiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQmluYW5jZS8xLjQ1LjEgQ2hyb21lLzEwMi4wLjUwMDUuMTY3IEVsZWN0cm9uLzE5LjEuOSBTYWZhcmkvNTM3LjM2IiwibGlzdF9wbHVnaW4iOiJQREYgVmlld2VyLENocm9tZSBQREYgVmlld2VyLENocm9taXVtIFBERiBWaWV3ZXIsTWljcm9zb2Z0IEVkZ2UgUERGIFZpZXdlcixXZWJLaXQgYnVpbHQtaW4gUERGIiwiY2FudmFzX2NvZGUiOiIxMjA4OWQwMyIsIndlYmdsX3ZlbmRvciI6Ikdvb2dsZSBJbmMuIChJbnRlbCkiLCJ3ZWJnbF9yZW5kZXJlciI6IkFOR0xFIChJbnRlbCwgSW50ZWwoUikgSXJpcyhSKSBYZSBHcmFwaGljcyBEaXJlY3QzRDExIHZzXzVfMCBwc181XzAsIEQzRDExKSIsImF1ZGlvIjoiMTI0LjA0MzQ3NTI3NTE2MDc0IiwicGxhdGZvcm0iOiJXaW4zMiIsIndlYl90aW1lem9uZSI6IkFzaWEvU2hhbmdoYWkiLCJkZXZpY2VfbmFtZSI6IkNocm9tZSBWMTAyLjAuNTAwNS4xNjcgKFdpbmRvd3MpIiwiZmluZ2VycHJpbnQiOiI1OWQwMDA2YmZhZjYzYzk4ZmMzMzFlYWUxY2UyYzGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFM0YSIsImRldmljZV9pZCI6IiIsInJlbGF0ZWRfZGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDox",
                "eyJzY3JlZW5fcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiYXZhaWxhYmxlX3NjcmVlbl9yZXNvbHV0aW9uIjoiODE2LDE1MzYiLCJzeXN0ZW1fdmVyc2lvbikcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWF4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDoxI6IldpbmRvd3MgMTAiLCJicmFuZF9tb2RlbCI6InVua25vd24iLCJzeXN0ZW1fbGFuZyI6InpoLUN2RlbCI6InVfcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiOIiwidGltZXpvbmUiOiJHTVQrOCIsInRpbWV6b25lT2Zmc2V0IjotNDgwLCJ1c2VyX2FnZW50IjoiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQmluYW5jZS8xLjQ1LjEgQ2hyb21lLzEwMi4wLjUwMDUuMTY3IEVsZWN0cm9uLzE5LjEuOSBTYWZhcmkvNTM3LjM2IiwibGlzdF9wbHVnaW4iOiJQREYgVmlld2VyLENocm9tZSBQREYgVmlld2VyLENocm9taXVtIFBERiBWaWV3ZXIsTWljcm9zb2Z0IEVkZ2UgUERGIFZpZXdlcixXZWJLaXQgYnVpbHQtaW4gUERGIiwiY2FudmFzX2NvZGUiOiIxMjA4OWQwMyIsIndlYmdsX3ZlbmRvciI6Ikdvb2dsZSBJbmMuIChJbnRlbCkiLCJ3ZWJnbF9yZW5kZXJlciI6IkFOR0xFIChJbnRlbCwgSW50ZWwoUikgSXJpcyhSKSBYZSBHcmFwaGljcyBEaXJlY3QzRDExIHZzXzVfMCBwc181XzAsIEQzRDExKSIsImF1ZGlvIjoiMTI0LjA0MzQ3NTI3NTE2MDc0IiwicGxhdGZvcm0iOiJXaW4zMiIsIndlYl90aW1lem9uZSI6IkFzaWEvU2hhbmdoYWkiLCJkZXZpY2VfbmFtZSI6IkNocm9tZSBWMTAyLjAuNTAwNS4xNjcgKFdpbmRvd3MpIiwiZmluZ2VycHJpbnQiOiI1OWQwMDA2YmZhZjYzYzk4ZmMzMzFlYWUGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFxY2UyYzM0YSIsImRldmljZV9pZCI6IiIsInJlbGF0ZWRfZGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDox",
                "eyJzY3JlZW5fcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiYXZhaWxhYmxlX3NjcmVlbl9yZXNvbHV0aW9uIjoiODE2LDE1MzYiLCJzeXN0ZW1fdmVyc2lvbiI6IldpbmRvd3MgMTAiLCJicmFuZkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWF4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDoxF9tb2RlbCI6InVua252RlbCI6InVfcmVzb2x1dGlvbiI6Ijg2NCwxNTM2Iiwivd24iLCJzeXN0ZW1fbGFuZyI6InpoLUNOIiwidGltZXpvbmUiOiJHTVQrOCIsInRpbWV6b25lT2Zmc2V0IjotNDgwLCJ1c2VyX2FnZW50IjoiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQmluYW5jZS8xLjQ1LjEgQ2hyb21lLzEwMi4wLjUwMDUuMTY3IEVsZWN0cm9uLzE5LjEuOSBTYWZhcmkvNTM3LjM2IiwibGlzdF9wbHVnaW4iOiJQREYgVmlld2VyLENocm9tZSBQREYgVmlld2VyLENocm9taXVtIFBERiBWaWV3ZXIsTWljcm9zb2Z0IEVkZ2UgUERGIFZpZXdlcixXZWJLaXQgYnVpbHQtaW4gUERGIiwiY2FudmFzX2NvZGUiOiIxMjA4OWQwMyIsIndlYmdsX3ZlbmRvciI6Ikdvb2dsZSBJbmMuIChJbnRlbCkiLCJ3ZWJnbF9yZW5kZXJlciI6IkFOR0xFIChJbnRlbCwgSW50ZWwoUikgSXJpcyhSKSBYZSBHcmFwaGljcyBEaXJlY3QzRDExIHZzXzVfMCBwc181XzAsIEQzRDExKSIsImF1ZGlvIjoiMTI0LjA0MzQ3NTI3NTE2MDc0IiwicGxhdGZvcm0iOiJXaW4zMiIsIndlYl90aW1lem9uZSI6IkFzaWEvU2hhbmdoYWkiLCJkZXZpY2VfbmFtZSI6IkNocm9tZSBWMTAyLjAuNTAwNS4xNjcgKFdpbmRvd3MpIiwiZmluZ2VycHJpbnQiOiI1OWQwMDA2YmZhZjYzYzk4ZmMzMzFlYWGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFUxY2UyYzM0YSIsImRldmljZV9pZCI6IiIsInJlbGF0ZWRfZGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDox",
                "eyJzY3JlZW5fcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiYXZhaWxhYmxlX3NjcmVlbl9yZXNvbHV0aW9uIjoiODE2LDE1MzYiLCJzeXN0ZW1fdmVyc2lvbiI6IldpbmRvd3MgMTAiLCJicmFuZF9tb2RlbCI6InVua25vd24iLCJzkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWF4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDoxeXN0ZW1fbGFuZyI6InpoLUNOIiwidGltZXpvbmUiOi2RlbCI6InVfcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiJHTVQrOCIsInRpbWV6b25lT2Zmc2V0IjotNDgwLCJ1c2VyX2FnZW50IjoiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQmluYW5jZS8xLjQ1LjEgQ2hyb21lLzEwMi4wLjUwMDUuMTY3IEVsZWN0cm9uLzE5LjEuOSBTYWZhcmkvNTM3LjM2IiwibGlzdF9wbHVnaW4iOiJQREYgVmlld2VyLENocm9tZSBQREYgVmlld2VyLENocm9taXVtIFBERiBWaWV3ZXIsTWljcm9zb2Z0IEVkZ2UgUERGIFZpZXdlcixXZWJLaXQgYnVpbHQtaW4gUERGIiwiY2FudmFzX2NvZGUiOiIxMjA4OWQwMyIsIndlYmdsX3ZlbmRvciI6Ikdvb2dsZSBJbmMuIChJbnRlbCkiLCJ3ZWJnbF9yZW5kZXJlciI6IkFOR0xFIChJbnRlbCwgSW50ZWwoUikgSXJpcyhSKSBYZSBHcmFwaGljcyBEaXJlY3QzRDExIHZzXzVfMCBwc181XzAsIEQzRDExKSIsImF1ZGlvIjoiMTI0LjA0MzQ3NTI3NTE2MDc0IiwicGxhdGZvcm0iOiJXaW4zMiIsIndlYl90aW1lem9uZSI6IkFzaWEvU2hhbmdoYWkiLCJkZXZpY2VfbmFtZSI6IkNocm9tZSBWMTAyLjAuNTAwNS4xNjcgKFdpbmRvd3MpIiwiZmluZ2VycHJpbnQiOiI1OWQwMDA2YmZhZjYzYzk4ZmMzMzFlYWUxY2UyYzGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFM0YSIsImRldmljZV9pZCI6IiIsInJlbGF0ZWRfZGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDox",
                "eyJzY3JlZW5fcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiYXZhaWxhYmxlX3NjcmVlbl9yZXNvbHV0aW9uIjoiODE2LDE1MzYiLCJzeXN0ZW1fdmVyc2lvbiI6IldpbmRvd3MgMTAiLCJicmFuZF9tb2Rl2RlbCI6InVfcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwibCI6kcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWF4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDoxInVua25vd24iLCJzeXN0ZW1fbGFuZyI6InpoLUNOIiwidGltZXpvbmUiOiJHTVQrOCIsInRpbWV6b25lT2Zmc2V0IjotNDgwLCJ1c2VyX2FnZW50IjoiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQmluYW5jZS8xLjQ1LjEgQ2hyb21lLzEwMi4wLjUwMDUuMTY3IEVsZWN0cm9uLzE5LjEuOSBTYWZhcmkvNTM3LjM2IiwibGlzdF9wbHVnaW4iOiJQREYgVmlld2VyLENocm9tZSBQREYgVmlld2VyLENocm9taXVtIFBERiBWaWV3ZXIsTWljcm9zb2Z0IEVkZ2UgUERGIFZpZXdlcixXZWJLaXQgYnVpbHQtaW4gUERGIiwiY2FudmFzX2NvZGUiOiIxMjA4OWQwMyIsIndlYmdsX3ZlbmRvciI6Ikdvb2dsZSBJbmMuIChJbnRlbCkiLCJ3ZWJnbF9yZW5kZXJlciI6IkFOR0xFIChJbnRlbCwgSW50ZWwoUikgSXJpcyhSKSBYZSBHcmFwaGljcyBEaXJlY3QzRDExIHZzXzVfMCBwc181XzAsIEQzRDExKSIsImF1ZGlvIjoiMTI0LjA0MzQ3NTI3NTE2MDc0IiwicGxhdGZvcm0iOiJXaW4zMiIsIndlYl90aW1lem9uZSI6IkFzaWEvU2hhbmdoYWkiLCJkZXZpY2VfbmFtZSI6IkNocm9tZSBWMTAyLjAuNTAwNS4xNjcgKFdpbmRvd3MpIiwiZmluZ2VycHJpbnQiOiI1OWQwMDA2YmZhZjYGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFzYzk4ZmMzMzFlYWUxY2UyYzM0YSIsImRldmljZV9pZCI6IiIsInJlbGF0ZWRfZGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDox",
                "eyJzY3JlZW5fcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiYXZhaWxhYmxlX3NjcmVlbl9yZXNvbHV0aW9uIjoiODE2LDE1MzYiLCJzeXN0ZW1fdmVyc2lvbiI6IldpbmRvd3MgMTAiLCJicmFuZF9tb2RlbCI6InVua25vd24iLCJzeXN0ZW1fbGFuZyI6InpoLUNOIiwidGltZXpvbmUiOiJHTV2RlbCI6InkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWF4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDoxVfcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiQrOCIsInRpbWV6b25lT2Zmc2V0IjotNDgwLCJ1c2VyX2FnZW50IjoiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQmluYW5jZS8xLjQ1LjEgQ2hyb21lLzEwMi4wLjUwMDUuMTY3IEVsZWN0cm9uLzE5LjEuOSBTYWZhcmkvNTM3LjM2IiwibGlzdF9wbHVnaW4iOiJQREYgVmlld2VyLENocm9tZSBQREYgVmlld2VyLENocm9taXVtIFBERiBWaWV3ZXIsTWljcm9zb2Z0IEVkZ2UgUERGIFZpZXdlcixXZWJLaXQgYnVpbHQtaW4gUERGIiwiY2FudmFzX2NvZGUiOiIxMjA4OWQwMyIsIndlYmdsX3ZlbmRvciI6Ikdvb2dsZSBJbmMuIChJbnRlbCkiLCJ3ZWJnbF9yZW5kZXJlciI6IkFOR0xFIChJbnRlbCwgSW50ZWwoUikgSXJpcyhSKSBYZSBHcmFwaGljcyBEaXJlY3QzRDExIHZzXzVfMCBwc181XzAsIEQzRDExKSIsImF1ZGlvIjoiMTI0LjA0MzQ3NTI3NTE2MDc0IiwicGxhdGZvcm0iOiJXaW4zMiIsIndlYl90aW1lem9uZSI6IkFzaWEvU2hhbmdoYWkiLCJkZXZpY2VfbmFtZSI6IkNocm9tZSBWMTAyLjAuNTAwNS4xNjcgKFdpbmRvd3MpIiwiZmluZ2VycHJpbnQiOiI1OWQwMDA2YmZhZjYzYzk4ZmMzMzFlYWUxY2UyYzM0GV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFYSIsImRldmljZV9pZCI6IiIsInJlbGF0ZWRfZGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDox",
                "eyJzY3JlZW5fcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiYXZhaWxhYmxlX3NjcmVlbl9yZXNvbHV0aW9uIjoiODE2LDE1MzYiLCJzeXN0ZW1fdmVyc2lvbiI6IldpbmRvd3MgMTAiLCJicmFuZF9tb2RlbCI6In2RlbCI6InVfcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiVua25vd24iLCJzeXN0ZW1fbGFuZyI6InpoLUNOIiwidGltZXpvbmUkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWF4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDoxiOiJHTVQrOCIsInRpbWV6b25lT2Zmc2V0IjotNDgwLCJ1c2VyX2FnZW50IjoiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQmluYW5jZS8xLjQ1LjEgQ2hyb21lLzEwMi4wLjUwMDUuMTY3IEVsZWN0cm9uLzE5LjEuOSBTYWZhcmkvNTM3LjM2IiwibGlzdF9wbHVnaW4iOiJQREYgVmlld2VyLENocm9tZSBQREYgVmlld2VyLENocm9taXVtIFBERiBWaWV3ZXIsTWljcm9zb2Z0IEVkZ2UgUERGIFZpZXdlcixXZWJLaXQgYnVpbHQtaW4gUERGIiwiY2FudmFzX2NvZGUiOiIxMjA4OWQwMyIsIndlYmdsX3ZlbmRvciI6Ikdvb2dsZSBJbmMuIChJbnRlbCkiLCJ3ZWJnbF9yZW5kZXJlciI6IkFOR0xFIChJbnRlbCwgSW50ZWwoUikgSXJpcyhSKSBYZSBHcmFwaGljcyBEaXJlY3QzRDExIHZzXzVfMCBwc181XzAsIEQzRDExKSIsImF1ZGlvIjoiMTI0LjA0MzQ3NTI3NTE2MDc0IiwicGxhdGZvcm0iOiJXaW4zMiIsIndlYl90aW1lem9uZSI6IkFzaWEvU2hhbmdoYWkiLCJkZXZpY2VfbmFtZSI6IkNocm9tZSBWMTAyLjAuNTAwNS4xNjcgKFdpbmRvd3MpIiwiZmluZ2VycHJpbnQiOiI1OWQwMDA2YmZhZjYzGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFYzk4ZmMzMzFlYWUxY2UyYzM0YSIsImRldmljZV9pZCI6IiIsInJlbGF0ZWRfZGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDox",
                "eyJzY3JlZW5fcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiYXZhaWxhYmxlX3NjcmVlbl9yZXNvbHV0aW9uIjoiODE2LDE1MzYiLCJzeXN0ZW1fdmVyc2lvbiI6IldpbmRvd3MgMTAiLCJicmFuZF9tb2RlbCI6InVua25vd24iLCJzeXN0ZW1fbGFuZyI6InpoLUNOIiwidGltZXpvbmUiOiJHTVQrOCIsInRpb2RlbCI6InVfcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiWV6b25lTkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWF4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDox2Zmc2V0IjotNDgwLCJ1c2VyX2FnZW50IjoiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQmluYW5jZS8xLjQ1LjEgQ2hyb21lLzEwMi4wLjUwMDUuMTY3IEVsZWN0cm9uLzE5LjEuOSBTYWZhcmkvNTM3LjM2IiwibGlzdF9wbHVnaW4iOiJQREYgVmlld2VyLENocm9tZSBQREYgVmlld2VyLENocm9taXVtIFBERiBWaWV3ZXIsTWljcm9zb2Z0IEVkZ2UgUERGIFZpZXdlcixXZWJLaXQgYnVpbHQtaW4gUERGIiwiY2FudmFzX2NvZGUiOiIxMjA4OWQwMyIsIndlYmdsX3ZlbmRvciI6Ikdvb2dsZSBJbmMuIChJbnRlbCkiLCJ3ZWJnbF9yZW5kZXJlciI6IkFOR0xFIChJbnRlbCwgSW50ZWwoUikgSXJpcyhSKSBYZSBHcmFwaGljcyBEaXJlY3QzRDExIHZzXzVfMCBwc181XzAsIEQzRDExKSIsImF1ZGlvIjoiMTI0LjA0MzQ3NTI3NTE2MDc0IiwicGxhdGZvcm0iOiJXaW4zMiIsIndlYl90aW1lem9uZSI6IkFzaWEvU2hhbmdoYWkiLCJkZXZpY2VfbmFtZSI6IkNocm9tZSBWMTAyLjAuNTAwNS4xNjcgKFdpbmRvd3MpIiwiZmluZ2VycHJpbnQiOiI1OWQwMDA2YmZhZjYzYzk4ZmMzMzFlYWUxY2UyYzM0YGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFSIsImRldmljZV9pZCI6IiIsInJlbGF0ZWRfZGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDox",
                "eyJzY3JlZW5fcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiYXZhaWxhYmxlX3NjcmVlbl9yZXNvbHV0aW9uIjoiODE2LDE1MzYiLCJzeXN0ZW1fdmVyc2lvbiI6IldpbmRvd3MgMTAiLCJicmFuZF9tb2RlbCI6InVua25vd24iLCJzeXN0ZW2RlbCI6InVfcmVzb2x1dGlvbiI6Ijg2NCwxNTM2Iiwi1fbGFuZyI6InpoLUNOIiwidGltZXpvbmUiOiJHTVQrOCIsInRpbWV6b25lT2Zmc2V0IjotNDkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWF4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDoxgwLCJ1c2VyX2FnZW50IjoiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQmluYW5jZS8xLjQ1LjEgQ2hyb21lLzEwMi4wLjUwMDUuMTY3IEVsZWN0cm9uLzE5LjEuOSBTYWZhcmkvNTM3LjM2IiwibGlzdF9wbHVnaW4iOiJQREYgVmlld2VyLENocm9tZSBQREYgVmlld2VyLENocm9taXVtIFBERiBWaWV3ZXIsTWljcm9zb2Z0IEVkZ2UgUERGIFZpZXdlcixXZWJLaXQgYnVpbHQtaW4gUERGIiwiY2FudmFzX2NvZGUiOiIxMjA4OWQwMyIsIndlYmdsX3ZlbmRvciI6Ikdvb2dsZSBJbmMuIChJbnRlbCkiLCJ3ZWJnbF9yZW5kZXJlciI6IkFOR0xFIChJbnRlbCwgSW50ZWwoUikgSXJpcyhSKSBYZSBHcmFwaGljcyBEaXJlY3QzRDExIHZzXzVfMCBwc181XzAsIEQzRDExKSIsImF1ZGlvIjoiMTI0LjA0MzQ3NTI3NTE2MDc0IiwicGxhdGZvcm0iOiJXaW4zMiIsIndlYl90aW1lem9uZSI6IkFzaWEvU2hhbmdoYWkiLCJkZXZpY2VfbmFtZSI6IkNocm9tZSBWMTAyLjAuNTAwNS4xNjcgKFdpbmRvd3MpIiwiZmluZ2VycHJpbnQiOiI1OWQwMDA2YmZhZjYzYzGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFk4ZmMzMzFlYWUxY2UyYzM0YSIsImRldmljZV9pZCI6IiIsInJlbGF0ZWRfZGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDox",
                "eyJzY3JlZW5fcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiYXZhaWxhYmxlX3NjcmVlbl9yZXNvbHV0aW9uIjoiODE2LDE1MzYiLCJzeXN0ZW1fdmVyc2lvbiI6IldpbmRvd3MgMTAiLCJicmFuZF9tb2RlbCI6InVua25vd242RlbCI6InVfcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiiLCJzeXN0ZW1fbGFuZyI6InpoLUNOIiwidGltZXpvbmUiOiJHTVQrOCIsInRpbWV6b25lT2Zmc2V0IjotNDgwLCJ1c2VyX2kcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWF4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDoxFnZW50IjoiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQmluYW5jZS8xLjQ1LjEgQ2hyb21lLzEwMi4wLjUwMDUuMTY3IEVsZWN0cm9uLzE5LjEuOSBTYWZhcmkvNTM3LjM2IiwibGlzdF9wbHVnaW4iOiJQREYgVmlld2VyLENocm9tZSBQREYgVmlld2VyLENocm9taXVtIFBERiBWaWV3ZXIsTWljcm9zb2Z0IEVkZ2UgUERGIFZpZXdlcixXZWJLaXQgYnVpbHQtaW4gUERGIiwiY2FudmFzX2NvZGUiOiIxMjA4OWQwMyIsIndlYmdsX3ZlbmRvciI6Ikdvb2dsZSBJbmMuIChJbnRlbCkiLCJ3ZWJnbF9yZW5kZXJlciI6IkFOR0xFIChJbnRlbCwgSW50ZWwoUikgSXJpcyhSKSBYZSBHcmFwaGljcyBEaXJlY3QzRDExIHZzXzVfMCBwc181XzAsIEQzRDExKSIsImF1ZGlvIjoiMTI0LjA0MzQ3NTI3NTE2MDc0IiwicGxhdGZvcm0iOiJXaW4zMiIsIndlYl90aW1lem9uZSI6IkFzaWEvU2hhbmdoYWkiLCJkZXZpY2VfbmFtZSI6IkNocm9tZSBWMTAyLjAuNTAwNS4xNjcgKFdpbmRvd3MpIiwiZmluZ2VycHJpbnQiOiI1OWQwMDA2YmZhZjYzYzk4ZmMzMzFlYWUxY2UyYzM0YSIGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFsImRldmljZV9pZCI6IiIsInJlbGF0ZWRfZGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDox",
                "eyJzY3JlZW5fcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiYXZhaWxhYmxlX3NjcmVlbl9yZXNvbHV0aW9uIjoiODE2LDE1MzYiLCJzeXN0ZW1fdmVyc2lvbiI6IldpbmRvd3MgMTAiLCJicmFuZF9tb2RlbCI6InVua25vd24iLCJzeXN0ZW1fbGFuZyI6InpoLUNOIiwidGltZXpvbmUiOi2RlbCI6InVfcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiJHTVQrOCIsInRpbWV6b25lT2Zmc2V0IjotNDgwLCJ1c2VyX2FnZW50IjoiTWkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWF4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDox96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQmluYW5jZS8xLjQ1LjEgQ2hyb21lLzEwMi4wLjUwMDUuMTY3IEVsZWN0cm9uLzE5LjEuOSBTYWZhcmkvNTM3LjM2IiwibGlzdF9wbHVnaW4iOiJQREYgVmlld2VyLENocm9tZSBQREYgVmlld2VyLENocm9taXVtIFBERiBWaWV3ZXIsTWljcm9zb2Z0IEVkZ2UgUERGIFZpZXdlcixXZWJLaXQgYnVpbHQtaW4gUERGIiwiY2FudmFzX2NvZGUiOiIxMjA4OWQwMyIsIndlYmdsX3ZlbmRvciI6Ikdvb2dsZSBJbmMuIChJbnRlbCkiLCJ3ZWJnbF9yZW5kZXJlciI6IkFOR0xFIChJbnRlbCwgSW50ZWwoUikgSXJpcyhSKSBYZSBHcmFwaGljcyBEaXJlY3QzRDExIHZzXzVfMCBwc181XzAsIEQzRDExKSIsImF1ZGlvIjoiMTI0LjA0MzQ3NTI3NTE2MDc0IiwicGxhdGZvcm0iOiJXaW4zMiIsIndlYl90aW1lem9uZSI6IkFzaWEvU2hhbmdoYWkiLCJkZXZpY2VfbmFtZSI6IkNocm9tZSBWMTAyLjAuNTAwNS4xNjcgKFdpbmRvd3MpIiwiZmluZ2VycHJpbnQiOiI1OWQwMDA2YmZhZjYzYzk4GV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFZmMzMzFlYWUxY2UyYzM0YSIsImRldmljZV9pZCI6IiIsInJlbGF0ZWRfZGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41Ni4xIiwibWFjX2FkZHJlc3MiOiIwYTowMDoyNzowMDowMDox",
                "eyJzY3JlZW5fcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiYXZhaWxhYmxlX3NjcmVlbl9yZXNvbHV0aW9uIjoiODE2LDE1MzYiLCJzeXN0ZW1fdmVyc2lvbiI6IldpbmRvd3MgMTAiLCJicmFuZF9tb2RlbCI6InVua25vd24iLCJzeXN0ZW1fbGFuZyI6InpoLUNOIiwidGltZXpvbmUiOiJHTVQrOCIsInRpbWV6b25lT2Zmc2V0IjotNDgwL2RlbCI6InVfcmVzb2x1dGlvbiI6Ijg2NCwxNTM2IiwiCJ1c2VyX2FnZW50IjoiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQmluYW5jZS8xLjQ1LjEgQ2hyb21lLzEwMi4wLjUwMDUuMTY3IEVsZWN0cm9uLzE5LjEuOSBTYWZhcmkvNTM3LjM2IiwibGlzdF9wbHVnaW4iOiJQREYgVmlld2VyLENocm9tZSBQREYgVmlld2VyLENocm9taXVtIFBERiBWaWV3ZXIsTWljcm9zb2Z0IEVkZ2UgUERGIFZpZXdlcixXZWJLaXQgYnVpbHQtaW4gUERGIiwiY2FudmFzX2NvZGUiOiIxMjA4OWQwMyIsIndlYmdsX3ZlbmRvciI6Ikdvb2dsZSBJbmMuIChJbnRlbCkiLCJ3ZWJnbF9yZW5kZXJlciI6IkFOR0xFIChJbnRlbCwgSW50ZWwoUikgSXJpcyhSKSBYZSBHcmFwaGljcyBEaXJlY3QzRDExIHZzXzVfMCBwc181XzAsIEQzRDExKSIsImF1ZGlvIjoiMTI0LjA0MzQ3NTI3NTE2MDc0IiwicGxhdGZvcm0iOiJXaW4zMiIsIndlYl90aW1lem9uZSI6IkFzaWEvU2hhbmdoYWkiLCJkZXZpY2VfbmFtZSI6IkNocm9tZSBWMTAyLjAuNTAwNS4xNjcgKFdpbmRvd3MpIiwiZmluZ2VycHJpbnQiOiI1OWQwMDA2YmZhZjYzYzk4ZmMzMzFlYWUxY2UyYzM0YSIsImRldmljZV9pZCI6IiIsInJlbGF0ZWRfZGV2aWNlX2lkcyI6IiIsImxvZ2luX2lwIjoiMTkyLjE2OC41NiGV2aWNlX2l");
        return list.get(new Random().nextInt(20));
    }

    public String randomFvideo() {
        List<String> list = Arrays.asList("8a94dc4ab0ed5eafc8089817aa96524d",
                "f65ecc1e018426202fc45ff8245e2d7e",
                "6afdd278dd9079ea974f2f0f7d177371",
                "3b5a2e0ac6a19e08e4eb23fb7f33be58",
                "13bc9fb914ebb9ae8f1d55fec3af8e39",
                "a5aa6b0271fe3e83d33d2133827dcdd9",
                "25c461a481885344dca2b48249e56cf5",
                "3d26a654d185a7621ad2d40efa12ad03",
                "8d3b44f0e7379d911f5da250d523f298",
                "3c6192d686277a19dd52876d02a136a2",
                "23169c192ee5b1a0b9bce8c4d5790c78",
                "9e32319b64920fcf7d287923e28da595",
                "c6879edcd181fd09d3b77fb3bb647028",
                "bfa43697f0e96ce0da3f2a93185de4ed",
                "cb584972858752400e45b5cd42491608",
                "4f112d14dd692492a0e0fd549dfd304a",
                "d4e1833ff7ab85f8f3bd659c2699f1f1",
                "b63ca2f520477cdc5bbab021f622949e",
                "16df2224bd808406755f97381fb92311",
                "7d854b11b3b5cec9a9529509b4f7e862");
        return list.get(new Random().nextInt(20));
    }

    public String randomToken() {
        List<String> list = Arrays.asList("4GMH38QGWJVHSJ3MIL0CF8XJAMCKFGSY",
                "TJV1RJ94ROO9KNLE0URL12QEJ4KXDV9S",
                "FR1SB3FUO5M4ID9QH7J19C10XXZU0QVT",
                "8P97J2A4K9MR33JOF3YN2JEF5YOYK8GJ",
                "NYDKPNP1LLNV5US97TEAZUTDXKJIFOTP",
                "6QKAD4XQ6CUZHR8FGT8A9S38IHFCPO3Q",
                "WIFEB64U024QZCHF70GM140MCF2LK1EY",
                "187FHCDCRCGMWKBMC32XSXF8WUSXNLR0",
                "ZHNWMQFGUT5B6COJ6KT0B9U8WCT0ARWZ",
                "A5AJZYD499RICIB7LSNMLMFHHAADGE9G",
                "WE8QT6CH36HL4N0D6IICPJ4HAA2XM26V",
                "B9MWKTBC7RGGGPO8CGTHG6M6ZVSNYQSX",
                "QO4VIUUQMM11CJTOLYRBM661ZAMINVEG",
                "HB4NIDMN90FVHIHSV93V7JFCDQZ2MJ0Q",
                "6CKW5WI87I8KT67QJY7S1ZTS8J74YHLX",
                "VNTQ519K0CGD85OSKN177AI6SCZ464GP",
                "ADI2SZFIDQP1ZUZHGB6SEQCTYW11PWIR",
                "OOQ4HCM2LVGE6YZ0N7OCW3JW84T1P2MC",
                "XMQ3UAQQ1YJQS7C4R0TSKRLQ5AQF3HBA",
                "HUFNY4902D3T8CXO3RCNS2142BEXYLQ1");
        return list.get(new Random().nextInt(20));
    }

    public static String toStrTime(String timestampStr) {
        long timestamp = Long.parseLong(timestampStr);
        Date date = new Date(timestamp);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(date);
    }

    public static void callBot(String content) {
        Long timestamp = System.currentTimeMillis();
        String sign;
        String secret = "机器人key";
        String stringToSign = timestamp + "\n" + secret;
        Mac mac;
        try {
            mac = Mac.getInstance("HmacSHA256");
            mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
            byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8));
            sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
            String postUrl = "https://oapi.dingtalk.com/robot/send?access_token=机器人key&timestamp=" + timestamp + "&sign=" + sign;
            String body = "{ \"msgtype\": \"text\", \"text\": { \"content\": \"" + content + "\" }}";
            log.info(body);
            HttpResponse postResponse = HttpRequest.post(postUrl)
                    .header("Content-Type", "application/json;charset=utf-8")
                    .body(body)
                    .execute();
            if (postResponse.getStatus() != 200) {
                Thread.sleep(10000);
                callBot(content);
            }
            String res = "{\"errcode\":0,\"errmsg\":\"ok\"}";
            if (res.equals(postResponse.body())) {
                log.info("机器人调用成功");
            } else {
                log.info("机器人调用失败");
                Thread.sleep(10000);
                callBot(content);
            }

        } catch (Exception e) {
            e.printStackTrace();
            log.info("机器人异常:{}", e.getLocalizedMessage());
        }
    }
}
